// // // #include<iostream>
// // // #include<unistd.h>
// // // #include<string>
// // // #include<vector>
// // // #include<signal.h>

// // // // using namespace std;
// // // void handler(int signal)
// // // {

// // //     // zdl::
// // //     std::cout << "get signal as num :" << signal << std::endl;
// // // }
// // // int mai23n()
// // // {
// // // // 从默认终止， 就改为了执行默认的设置方法
// // // // zdl:: ctrl + / 就是捕获 3号信号
// // // // zdl:: CTRL + C 就是 2 号信号
// // // //  现在只有在捕获到2 和 3 号信号的时候才可以触发吧 这个信号函数
// // //     signal(SIGQUIT, handler);
// // //     while(true)
// // //     {
// // //         std::cout << "hello world" <<std::endl;
// // //         sleep(1);
// // //     }
// // //     return 0;
// // // }

// // // // zdl:: 现在我们害死需要进行更深程度的学习
// // // // qt html css javascript

// // // // zdl:: 在硬件上有意者重要的概念，硬件中断

// // // void usage(std::string proc)
// // // {
// // //     std::cout << "Usage : " << proc << " signumber " <<
// // //     "processed" << std::endl;
// // // }
// // // // 命令的格式 ： kill -9 --id
// // // // zdl:: 也就是我们需要传递的参需要是3个
// // // int main(int argc, char* argv[])
// // // {

// // //     // if (argc != 3)
// // //     // {
// // //     //     usage(argv[0]);
// // //     //     exit(1);
// // //     // }
// // //     // int signum = std::stoi(argv[1]);
// // //     // auto id = std::stoi(argv[2]);
// // //     // int n = ::kill(id, signum);
// // //     // if (n < 0)
// // //     // {
// // //     //     perror("kill");
// // //     //     exit(2);
// // //     // }
// // //     // exit(1);
// // //     // return 0;

// // //     // raise(9);

// // //     int cnt = 5;
// // //     while (true)
// // //     {
// // //         std::cout << "hahahhaha" << std::endl;
// // //         cnt--;
// // //         if (cnt <= 0) abort();
// // //     }

// // //     return 0;
// // // }

// // #include "signal.hpp"
// // int number = 0;

// // void die(int )
// // {

// //     std::cout << "count :" << number << std::endl;
// //     exit(0);
// // }
// // int main(int argc, char *argv[])
// // {

// //     alarm(1);//zdl::在操作系统的角度上就是设置了一个定时器
// //     signal(SIGALRM, die);
// //     while (true)
// //     {
// //         // std::cout << "count :" << number << std::endl;
// //         number++;
// //     }

// //     return 0;
// // }

// #include"signal.hpp"

// // zdl:: 把信号切换为硬件中断，这个就是 operator ststerm 的
// // zdl:: 运行原理！！！！！
// // using func_t  = std::function<void()>;

// // std::vector<func_t> gfuncs;
// // int gcount;
// // void handler(int)
// // {
// //     for (auto& x : gfuncs)
// //     {
// //         x();
// //     }

// //     std::cout << "gcount :" << gcount << std::endl;
// //     alarm(1);
// // }

// // int main()
// // {

// //     gfuncs.emplace_back([](){
// //         std::cout << "I am a logger!" << std::endl;
// //     });
// //     gfuncs.emplace_back([](){
// //         std::cout << "I am a mysql!" << std::endl;
// //     });
// //     gfuncs.emplace_back([](){
// //         std::cout << "I am a downloader!" << std::endl;
// //     });

// //     // 现在开始设定一秒的的闹钟
// //     alarm(1); // 现在这个知识一个一次性的闹钟，结束之后就不会再执行

// //     signal(SIGALRM, handler);
// //     while (true)
// //     {
// //         // gcount++;
// //         pause();
// //         std::cout << "我醒来了...." << std::endl;
// //         gcount++;
// //         gcount /= 0;
// //     }

// //     return 0;
// // }

// // // zdl:: 异常

// // void handler(int signum)
// // {
// //     std::cout << "get a signal :" << signum << std::endl;
// // }

// // int main()
// // {

// //     // signal(11, handler);
// //     int *p = nullptr;
// //     *p = 100;

// //     return 0;
// // }

// void handler(int signum)
// {
//     std::cout << "get a signal :" << signum << std::endl;
//     exit(1);
// }

// int main()
// {
//     // 1.信号捕捉
//     // 1. 默认
//     // 2.忽略
//     // 3.自定义捕捉
//     // 4.
//     // ::signal(2, handler);
//     // while (true)
//     // {

//     //     pause();
//     // }
//     ::signal(2, SIG_IGN);
//     ::signal(2, SIG_IGN);
//     while(true)
//     {
//         pause();
//         std::cout << "hello world" << std::endl;
//         sleep(1);
//     }
//     return 0;
// }

#include "signal.hpp"

void printPending(const sigset_t &pending)
{
    std::cout << "current pending list: [" << getpid() << "]";
    for (int i = 1; i < 32; ++i)
    {
        if (sigismember(&pending, i))
        {
            std::cout << i << " ";
        }
        else
            std::cout << "0" << " ";
    }
    std::cout << std::endl;
}
void non_handler(int signum)
{
    std::cout << "deal with the signal :" << signum << std::endl;
}
int main()
{
    ::signal(2, non_handler);
    // 1. 对2号信号进行屏蔽
    // 栈上开辟
    sigset_t block, oblock;
    sigemptyset(&block);
    sigemptyset(&oblock);
    // 1.1 添加 2号信号
    // 现在我们有没有将2号信号的屏蔽设置到内核中
    // 现在还没有进行真正的屏蔽

    sigaddset(&block, 2);
    // 1.2 设置屏蔽到内核中
    sigprocmask(SIG_SETMASK, &block, &oblock);
    int cnt = 0;
    while (true)
    {
        // zdl: 如何设置pending表
        sigset_t pending;
        sigpending(&pending);

        // 2.1 print
        printPending(pending);
        sleep(1);
        cnt++;
        if (cnt == 10)
        {
            std::cout << "接触信号屏蔽" << std::endl;
            //  oblock 就是老的屏蔽字
            sigprocmask(SIG_SETMASK, &oblock, nullptr);
        }
    }

    return 0;
}